package algorithm.middle;

import java.util.HashMap;
import java.util.Map;

/**
 * @BelongsProject: LeetCode
 * @BelongsPackage: algorithm.middle
 * @Author: 江岸
 * @CreateTime: 2021-04-04 20:39
 * @Description: 森林中，每个兔子都有颜色。其中一些兔子（可能是全部）告诉你还有多少其他的兔子和自己有相同的颜色。我们将这些回答放在 answers 数组里。
 *
 * 返回森林中兔子的最少数量。
 *
 * 示例:
 * 输入: answers = [1, 1, 2]
 * 输出: 5
 * 解释:
 * 两只回答了 "1" 的兔子可能有相同的颜色，设为红色。
 * 之后回答了 "2" 的兔子不会是红色，否则他们的回答会相互矛盾。
 * 设回答了 "2" 的兔子为蓝色。
 * 此外，森林中还应有另外 2 只蓝色兔子的回答没有包含在数组中。
 * 因此森林中兔子的最少数量是 5: 3 只回答的和 2 只没有回答的。
 *
 * 输入: answers = [10, 10, 10]
 * 输出: 11
 *
 * 输入: answers = []
 * 输出: 0
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/rabbits-in-forest
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class NumRabbits781 {

    public static void main(String[] args) {
        numRabbits(new int[]{1,0,1,0,1,});
    }

    /**
     * 那么这两种情况可以通过 ceil(n/(x+1))  来整合（其中 ceil() 是向上取整函数），
     * 即 n/(x+1) 向上取整 种不同颜色的兔子。 向上取整的函数可以自己实现，也可以转化为
     * (n+x)/(x+1) ，这个公式中的除法是 向下取整。证明在代码后面。
     *
     * 作者：fuxuemingzhu
     * 链接：https://leetcode-cn.com/problems/rabbits-in-forest/solution/fu-xue-ming-zhu-zhao-gui-lu-fu-xiang-sha-1yk3/
     * 来源：力扣（LeetCode）
     * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     */
    public static int numRabbits(int[] answers) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int x : answers){
            map.put(x,map.getOrDefault(x,0)+1);
        }
        int res = 0;
        for (Map.Entry<Integer,Integer> entry:map.entrySet()){
            //取天花板数
            double v = Double.parseDouble(entry.getValue() + "");
            int num = (int) (Math.ceil(v/(entry.getKey()+1))*(entry.getKey()+1));
            res+=num;
        }
        return res;
    }
}
